package smallfrench.moteur.biblio;

import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.interp.err.RException;

/**
 * Un booléen.
 * @author antoine1023
 *
 */
public final class RBooleen extends RObjet {

	public static final RBooleen VRAI = new RBooleen(true);
	public static final RBooleen FAUX = new RBooleen(false);

	public final boolean valeur;

	private RBooleen(boolean valeur) {
		super(RClasseBooleen.CLASSE);
		this.valeur = valeur;
	}

	public static RBooleen nouveau(boolean valeur) {
		return valeur ? VRAI : FAUX;
	}

	public String getNom() {
		return "Booleen";
	}

	//-------------------------------------------------------- Binaires Tests

	@Override
	public boolean equals(Object objet) {
		if (objet instanceof RBooleen) {
			RBooleen c = (RBooleen)objet;
			return c.valeur == valeur;
		}
		return false;
	}

	@Override
	public RObjet operateurPlusBase(RObjet o) {
		if (o instanceof RChaine) {
			return new RChaine(valeur + ((RChaine)o).valeur);
		}
		return null;
	}

	@Override
	public RBooleen operateurEgalBase(RObjet o) {
		if (o instanceof RBooleen) {
			return nouveau(((RBooleen)o).valeur == valeur);
		}
		return null;
	}
	@Override
	public RBooleen operateurInegalBase(RObjet o) {
		if (o instanceof RBooleen) {
			return nouveau(((RBooleen)o).valeur != valeur);
		}
		return null;
	}

	//----------------------------------------------------- Binaires booléens

	@Override
	public RBooleen operateurEtBase(RObjet o) {
		if (o instanceof RBooleen) {
			return nouveau(((RBooleen)o).valeur && valeur);
		}
		return null;
	}

	@Override
	public RBooleen operateurOuBase(RObjet o) {
		if (o instanceof RBooleen) {
			return nouveau(((RBooleen)o).valeur || valeur);
		}
		return null;
	}

	@Override
	public RBooleen operateurOuexBase(RObjet o) {
		if (o instanceof RBooleen) {
			return nouveau(((RBooleen)o).valeur ^ valeur);
		}
		return null;
	}

	//----------------------------------------------------- Unaires

	@Override
	public RBooleen operateurNonUnaire()
			throws RException {
		return nouveau(! valeur);
	}


	@Override
	public RChaine enChaine() {
		return new RChaine(valeur ? "vrai" : "faux");
	}

}
